package controlador;
import vista.*;
import java.io.FileOutputStream;
import java.io.IOException;
import modelo.*;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

import javax.swing.JComboBox;
import javax.swing.JFrame.*;

import controlador.ControlFacturaV.KeyL;
import modelo.Conexion;

public class ControlFacturaC implements ActionListener{

	private FacturaC factc;
	
	public ControlFacturaC()
	{
		super();
		this.factc = new FacturaC();
		this.factc.addListener(this);
		this.factc.setVisible(true);
		factc.setLocationRelativeTo(null);
		new KeyL();
		Ini();
	}
	
	public class KeyL implements KeyListener
	{
		public KeyL()
		{
			factc.addKeyListener(this);
		}
		public void keyPressed(KeyEvent k){}
		public void keyReleased(KeyEvent k){}
		public void keyTyped(KeyEvent k)
		{
			if(!(k.getKeyChar() >= '0' && k.getKeyChar() <= '9'))
				k.consume();
		}
	};
	
	private void Ini()
	{
		CargarIngredientes();
		factc.SetFecha(new Date());
		factc.setTxtCodProv("");
		factc.setRazonSocial("");
		factc.setDireccion("");
		factc.setIva("0.0");
		factc.setSubTotal("0.0");
		factc.setTotal("0.0");
		factc.setTxtCantidad(0);
		factc.setTxtPrecioU("0.0");
		factc.VaciarDatos();
		List<Object>L = new ArrayList();
		L.add("");
		L.add("");
		L.add("");
		L.add("");
		factc.Anadir(L);
		try
		{
			Conexion conexion= new Conexion();
			ResultSet registro;
			registro = conexion.consultar("SELECT COUNT(codproveedor) as N FROM fcompra");
			registro.next();
			factc.setNumeroC(registro.getInt("N")+1);
		}
		catch (SQLException f)
		{
			f.printStackTrace();
		}
	}
	
	/****************************** METODOS DE BUSQUEDAS ************************************/
	public void BuscarProveedor()
	{
		try
		{
            FacturaCDAO DAO = new FacturaCDAO();
			ResultSet registro = DAO.BuscarProveedor(factc.getTxtcodProv().getText());
			
			if(registro.next())
			{
				factc.setRazonSocial(registro.getString("razonsocial"));
				factc.setDireccion(registro.getString("direccion"));
				
			}
			else
			{
				factc.mostrarMensaje("El Proveedor " + factc.getTxtcodProv().getText() +" No esta registrado!");
				factc.setTxtCodProv("");
			}
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	private String BuscarCodigo(String str)
	{
		try
		{
			FacturaCDAO DAO = new FacturaCDAO();
			ResultSet registro = DAO.BuscarCodigoIngrediente(str);
			
			if(registro.next())
				return registro.getString("codingrediente");
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		return "";
	}
	
	private String BuscarExistencia(String str){
		try
		{
			FacturaCDAO DAO = new FacturaCDAO();
			ResultSet registro = DAO.BuscarExistencia(str);
			
			if(registro.next())
				return registro.getString("existencia");
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		return "";
	}

	/****************************** CARGAR COMBO ************************************/
	private void CargarIngredientes()
	{
		try
		{
			String Items = "";
			FacturaCDAO DAO = new FacturaCDAO();
			ResultSet registro = DAO.BuscarIngredientes();
			
			while(registro.next())
				Items +=  registro.getString("nombre") + ",";

			factc.setComboIngrediente(Items);
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	/****************************** METODO GUARDAR ************************************/
	public void GuardarFactura()
	{
		int t = factc.N_Elementos();
		if(t != 0 && !factc.getTxtcodProv().getText().equals(""))
		{
			String SQL = "INSERT INTO fcompra "+
			 "(nrocontrol, codproveedor,fechaemision) "+
			 "VALUES "+"('"+ factc.getNroControl().getText()  +
			 "','"+ factc.getTxtcodProv().getText()+
			 "','" + new Date() +"')";
	
	        Conexion.ejecutar(SQL);
			
	        Object DATOS[][] = factc.GetDatos();
			
			for(int i = 0;i < t;i++)
			{
				 SQL = "INSERT INTO compraingrediente "+
				 "(nrocontrol, codingrediente,cantidad,preciou) "+
				 "VALUES "+"" +
				 "("+ Integer.parseInt(factc.getNroControl().getText())  +
				 ",'"+ BuscarCodigo(DATOS[i][0].toString())+
				 "',"+ Float.parseFloat(DATOS[i][1].toString()) +
				 ","+ Float.parseFloat(DATOS[i][2].toString()) +")";
		        Conexion.ejecutar(SQL);
			}
			
			for(int i = 0;i < t;i++)
			{
				Float existencia = (float)0;
				existencia = Float.parseFloat(BuscarExistencia(BuscarCodigo(DATOS[i][0].toString()))) + Float.parseFloat(DATOS[i][2].toString());
		
				SQL = "UPDATE ingrediente SET existencia = '"+Float.parseFloat(existencia.toString())+"'  WHERE codingrediente = '" + BuscarCodigo(DATOS[i][0].toString()) + "'";
		        Conexion.ejecutar(SQL);
			}
			factc.mostrarMensaje("Factura de Compra guardada con Exito!");
			this.Ini();
		}
		else factc.mostrarMensaje("Faltan datos por cargar!");
	}
	
	public void actionPerformed(ActionEvent e)
    {
		if(e.getActionCommand().equals("B"))
		{
			BuscarProveedor();
		}
		else if (e.getActionCommand().equals("comboBoxChanged"))
			CargarIngredientes();
		else if (e.getActionCommand().equals("I"))
    	{
			if(factc.getComboIngrediente().getSelectedIndex() == -1)
				factc.mostrarMensaje("Seleccione un producto!");
		    else if(Integer.parseInt(factc.getTxtCantidad().getText())>0)
			{
				List<Object>L = new ArrayList();
				L.add(factc.getComboIngrediente().getItemAt(factc.getComboIngrediente().getSelectedIndex()));
				L.add(factc.getTxtPrecioU().getText());
				L.add(factc.getTxtCantidad().getText());
				L.add(Float.parseFloat(L.get(2).toString()) * Float.parseFloat(L.get(1).toString()));
			
				factc.Anadir(L);
				factc.setSubTotal(""+(Float.parseFloat(L.get(3).toString())+Float.parseFloat(factc.getSubTotal().getText())));
				factc.setIva(""+(0.12*Float.parseFloat(factc.getSubTotal().getText())));
				factc.setTotal(""+(Float.parseFloat(factc.getSubTotal().getText())+Float.parseFloat(factc.getIva().getText())));
			}
		    else factc.mostrarMensaje("Ingrese una cantidad valida!");
		}
		else if (e.getActionCommand().equals("Guardar"))
			GuardarFactura();
		else if (e.getActionCommand().equals("Imprimir"))
			factc.mostrarMensaje("Lo Sentimos aun no ha sido programada esta funcion!!!");
		else if (e.getActionCommand().equals("Cancelar"))
			Ini();
		else if (e.getActionCommand().equals("Salir"))
			factc.dispose();
    }
}
